Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / electron / backendProcess.js

Displaying Raw • Download


electron/backendProcess.js bce42bcdce0e7d2c6d78228e864a4cd1d974cc82 (bce42bcd) Text, 11.83 KB

Tff7b72const Te6edf3path Tff7b72= Te6edf3requireTb4b4b4(Ta5d6ff"node:path"Tb4b4b4)Tb4b4b4;
Tff7b72const Tb4b4b4{ Te6edf3spawnTff7b72: Te6edf3defaultSpawn Tb4b4b4} Tff7b72= Te6edf3requireTb4b4b4(Ta5d6ff"child_process"Tb4b4b4)Tb4b4b4;

Tff7b72const Tb4b4b4{ Te6edf3verifyBackendIntegrity Tb4b4b4} Tff7b72= Te6edf3requireTb4b4b4(Ta5d6ff"./backendIntegrity"Tb4b4b4)Tb4b4b4;
Tff7b72const Tb4b4b4{
Te6edf3clearCrashReportTb4b4b4,
Te6edf3getDiagnosticPathsTb4b4b4,
Te6edf3getLogsDirTb4b4b4,
Te6edf3loadCrashReportTb4b4b4,
Te6edf3persistCrashReportTb4b4b4,
Tb4b4b4} Tff7b72= Te6edf3requireTb4b4b4(Ta5d6ff"./backendCrashReport"Tb4b4b4)Tb4b4b4;
Tff7b72const Tb4b4b4{ Te6edf3killOrphanBackendProcesses Tb4b4b4} Tff7b72= Te6edf3requireTb4b4b4(Ta5d6ff"./backendProcessOrphans"Tb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3LOG_LINE_CAP Tff7b72= T79c0ff200Tb4b4b4;

Tff7b72function Te6edf3createInitialRuntimeStateTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{
Te6edf3startedTff7b72: Tff7b72falseTb4b4b4,
Te6edf3runningTff7b72: Tff7b72falseTb4b4b4,
Te6edf3pidTff7b72: Tff7b72nullTb4b4b4,
Te6edf3lastExitCodeTff7b72: Tff7b72nullTb4b4b4,
Te6edf3lastErrorTff7b72: Ta5d6ff""Tb4b4b4,
Te6edf3lastEventAtTff7b72: Tff7b72nullTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3createBackendProcessManagerTb4b4b4(Te6edf3depsTb4b4b4) Tb4b4b4{
Tff7b72const Tb4b4b4{
Te6edf3logTb4b4b4,
Te6edf3getDefaultStorageDirTb4b4b4,
Te6edf3getDefaultReticulumConfigDirTb4b4b4,
Te6edf3getMainWindowPageKindTb4b4b4,
Te6edf3notifyRendererTb4b4b4,
Te6edf3showCrashPageTb4b4b4,
Te6edf3spawnTff7b72: Te6edf3spawnFn Tff7b72= Te6edf3defaultSpawnTb4b4b4,
Tb4b4b4} Tff7b72= Te6edf3depsTb4b4b4;

Tff7b72let Te6edf3childProcess Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72let Te6edf3runtimeState Tff7b72= Te6edf3createInitialRuntimeStateTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72let Te6edf3logBuffers Tff7b72= Tb4b4b4{ Te6edf3stdoutTff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4, Te6edf3stderrTff7b72: Tb4b4b4[Tb4b4b4] Tb4b4b4}Tb4b4b4;
Tff7b72let Te6edf3lastCrash Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72let Te6edf3resolvedExePath Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72let Te6edf3userProvidedArguments Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;

Tff7b72const Te6edf3storageDir Tff7b72= Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3getDefaultStorageDirTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3reticulumConfigDir Tff7b72= Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3getDefaultReticulumConfigDirTb4b4b4(Tb4b4b4)Tb4b4b4;

Tff7b72function Te6edf3hydratePersistedCrashTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3persisted Tff7b72= Te6edf3loadCrashReportTb4b4b4(Te6edf3storageDirTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3persistedTb4b4b4) Tb4b4b4{
Te6edf3lastCrash Tff7b72= Te6edf3persistedTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3hydratePersistedCrashTb4b4b4(Tb4b4b4)Tb4b4b4;

Tff7b72function Te6edf3isRunningTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72!Tff7b72!Te6edf3childProcess Tff7b72&& Te6edf3childProcessTb4b4b4.Te6edf3exitCode Tff7b72=== Tff7b72null Tff7b72&& Te6edf3childProcessTb4b4b4.Te6edf3signalCode Tff7b72=== Tff7b72nullTb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3getRuntimeStateTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{
Tb4b4b4...Te6edf3runtimeStateTb4b4b4,
Te6edf3runningTff7b72: Te6edf3isRunningTb4b4b4(Tb4b4b4) Tff7b72&& Te6edf3runtimeStateTb4b4b4.Te6edf3startedTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3pushLogLineTb4b4b4(Te6edf3bufferTb4b4b4, Te6edf3lineTb4b4b4) Tb4b4b4{
Te6edf3bufferTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3lineTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3bufferTb4b4b4.Te6edf3length Tff7b72> Te6edf3LOG_LINE_CAPTb4b4b4) Tb4b4b4{
Te6edf3bufferTb4b4b4.Te6edf3shiftTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72function Te6edf3getJoinedLogsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{
Te6edf3stdoutTff7b72: Te6edf3logBuffersTb4b4b4.Te6edf3stdoutTb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4,
Te6edf3stderrTff7b72: Te6edf3logBuffersTb4b4b4.Te6edf3stderrTb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3getLastCrashTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3lastCrashTb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3getStartupDiagnosticsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3paths Tff7b72= Te6edf3getDiagnosticPathsTb4b4b4(Te6edf3storageDirTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3reticulumConfigDirTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Tb4b4b4{
Te6edf3runtimeTff7b72: Te6edf3getRuntimeStateTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3crashTff7b72: Te6edf3lastCrashTb4b4b4,
Te6edf3pathsTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3setUserProvidedArgumentsTb4b4b4(Te6edf3argsTb4b4b4) Tb4b4b4{
Te6edf3userProvidedArguments Tff7b72= Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3argsTb4b4b4) Tff7b72? Te6edf3args Tff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3resolveExecutablePathTb4b4b4(Te6edf3findExePathTb4b4b4) Tb4b4b4{
Te6edf3resolvedExePath Tff7b72= Te6edf3findExePathTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3resolvedExePathTb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3recordCrashTb4b4b4(Te6edf3codeTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3logs Tff7b72= Te6edf3getJoinedLogsTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3lastCrash Tff7b72= Tb4b4b4{
Te6edf3codeTb4b4b4,
Te6edf3stdoutTff7b72: Te6edf3logsTb4b4b4.Te6edf3stdoutTb4b4b4,
Te6edf3stderrTff7b72: Te6edf3logsTb4b4b4.Te6edf3stderrTb4b4b4,
Te6edf3atTff7b72: Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3pidTff7b72: Te6edf3runtimeStateTb4b4b4.Te6edf3pidTb4b4b4,
Te6edf3platformTff7b72: Te6edf3processTb4b4b4.Te6edf3platformTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tff7b72try Tb4b4b4{
Te6edf3persistCrashReportTb4b4b4(Te6edf3storageDirTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3lastCrashTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3errorTb4b4b4) Tb4b4b4{
Te6edf3logTb4b4b4(Ta5d6ff`Ta5d6ffFailed to persist backend crash report: Tffd700${Te6edf3error Tff7b72&& Te6edf3errorTb4b4b4.Te6edf3message Tff7b72? Te6edf3errorTb4b4b4.Te6edf3message Tff7b72: Te6edf3errorTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72function Te6edf3notifyStartupFailureTb4b4b4(Te6edf3codeTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3paths Tff7b72= Te6edf3getDiagnosticPathsTb4b4b4(Te6edf3storageDirTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3reticulumConfigDirTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3notifyRendererTb4b4b4(Ta5d6ff"backend-startup-failed"Tb4b4b4, Tb4b4b4{
Te6edf3codeTb4b4b4,
Te6edf3atTff7b72: Te6edf3lastCrashTff7b72?Tb4b4b4.Te6edf3at Tff7b72?? Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3stdoutTff7b72: Te6edf3lastCrashTff7b72?Tb4b4b4.Te6edf3stdout Tff7b72|| Ta5d6ff""Tb4b4b4,
Te6edf3stderrTff7b72: Te6edf3lastCrashTff7b72?Tb4b4b4.Te6edf3stderr Tff7b72|| Ta5d6ff""Tb4b4b4,
Te6edf3pathsTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3notifyRendererTb4b4b4(Ta5d6ff"backend-process-exited"Tb4b4b4, Tb4b4b4{ Te6edf3codeTb4b4b4, Te6edf3atTff7b72: Te6edf3lastCrashTff7b72?Tb4b4b4.Te6edf3at Tff7b72?? Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3attachChildHandlersTb4b4b4(Te6edf3procTb4b4b4) Tb4b4b4{
Te6edf3logBuffers Tff7b72= Tb4b4b4{ Te6edf3stdoutTff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4, Te6edf3stderrTff7b72: Tb4b4b4[Tb4b4b4] Tb4b4b4}Tb4b4b4;

Te6edf3procTb4b4b4.Te6edf3stdoutTb4b4b4.Te6edf3setEncodingTb4b4b4(Ta5d6ff"utf8"Tb4b4b4)Tb4b4b4;
Te6edf3procTb4b4b4.Te6edf3stdoutTb4b4b4.Te6edf3onTb4b4b4(Ta5d6ff"data"Tb4b4b4, Tb4b4b4(Te6edf3dataTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Te6edf3dataTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3logTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3pushLogLineTb4b4b4(Te6edf3logBuffersTb4b4b4.Te6edf3stdoutTb4b4b4, Te6edf3textTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3procTb4b4b4.Te6edf3stderrTb4b4b4.Te6edf3setEncodingTb4b4b4(Ta5d6ff"utf8"Tb4b4b4)Tb4b4b4;
Te6edf3procTb4b4b4.Te6edf3stderrTb4b4b4.Te6edf3onTb4b4b4(Ta5d6ff"data"Tb4b4b4, Tb4b4b4(Te6edf3dataTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Te6edf3dataTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3logTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3pushLogLineTb4b4b4(Te6edf3logBuffersTb4b4b4.Te6edf3stderrTb4b4b4, Te6edf3textTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3procTb4b4b4.Te6edf3onTb4b4b4(Ta5d6ff"error"Tb4b4b4, Tb4b4b4(Te6edf3errorTb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3logTb4b4b4(Te6edf3errorTb4b4b4)Tb4b4b4;
Te6edf3runtimeStateTb4b4b4.Te6edf3lastError Tff7b72= Te6edf3error Tff7b72&& Te6edf3errorTb4b4b4.Te6edf3message Tff7b72? Te6edf3errorTb4b4b4.Te6edf3message Tff7b72: Tffa657StringTb4b4b4(Te6edf3errorTb4b4b4)Tb4b4b4;
Te6edf3runtimeStateTb4b4b4.Te6edf3lastEventAt Tff7b72= Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3procTb4b4b4.Te6edf3onTb4b4b4(Ta5d6ff"exit"Tb4b4b4, Tff7b72async Tb4b4b4(Te6edf3codeTb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3runtimeStateTb4b4b4.Te6edf3running Tff7b72= Tff7b72falseTb4b4b4;
Te6edf3runtimeStateTb4b4b4.Te6edf3lastExitCode Tff7b72= Te6edf3codeTb4b4b4;
Te6edf3runtimeStateTb4b4b4.Te6edf3lastEventAt Tff7b72= Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3childProcess Tff7b72= Tff7b72nullTb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3code Tff7b72== Tff7b72null Tff7b72|| Te6edf3depsTb4b4b4.Te6edf3isQuitingTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}

Te6edf3recordCrashTb4b4b4(Te6edf3codeTb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3page Tff7b72= Te6edf3getMainWindowPageKindTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3page Tff7b72=== Ta5d6ff"loading"Tb4b4b4) Tb4b4b4{
Te6edf3notifyStartupFailureTb4b4b4(Te6edf3codeTb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}

Te6edf3notifyRendererTb4b4b4(Ta5d6ff"backend-process-exited"Tb4b4b4, Tb4b4b4{ Te6edf3codeTb4b4b4, Te6edf3atTff7b72: Te6edf3lastCrashTb4b4b4.Te6edf3at Tb4b4b4}Tb4b4b4)Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3page Tff7b72=== Ta5d6ff"app"Tb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3page Tff7b72=== Ta5d6ff"crash"Tb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}

Tff7b72await Te6edf3showCrashPageTb4b4b4(Te6edf3lastCrashTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3buildSpawnEnvTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3logsDir Tff7b72= Te6edf3getLogsDirTb4b4b4(Te6edf3storageDirTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Tb4b4b4{
Tb4b4b4...Te6edf3processTb4b4b4.Te6edf3envTb4b4b4,
Te6edf3MESHCHAT_LOG_DIRTff7b72: Te6edf3logsDirTb4b4b4,
Te6edf3MESHCHAT_STORAGE_DIRTff7b72: Te6edf3storageDirTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3MESHCHAT_RETICULUM_CONFIG_DIRTff7b72: Te6edf3reticulumConfigDirTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}

Tff7b72async Tff7b72function Te6edf3spawnBackendTb4b4b4(Te6edf3exePathTb4b4b4, Te6edf3integrityStatusRefTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3exePathTb4b4b4) Tb4b4b4{
Tff7b72throw Tff7b72new Tf85149ErrorTb4b4b4(Ta5d6ff"Backend executable path is not set."Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3isRunningTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{ Te6edf3okTff7b72: Tff7b72trueTb4b4b4, Te6edf3alreadyRunningTff7b72: Tff7b72true Tb4b4b4}Tb4b4b4;
Tb4b4b4}

Tff7b72const Te6edf3removed Tff7b72= Te6edf3killOrphanBackendProcessesTb4b4b4(Tff7b72nullTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3removed Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3logTb4b4b4(Ta5d6ff`Ta5d6ffRemoved Tffd700${Te6edf3removedTffd700}Ta5d6ff orphan backend process(es) before startup.Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3resolvedExePath Tff7b72= Te6edf3exePathTb4b4b4;
Tff7b72const Te6edf3exeDir Tff7b72= Te6edf3pathTb4b4b4.Te6edf3dirnameTb4b4b4(Te6edf3exePathTb4b4b4)Tb4b4b4;
Te6edf3integrityStatusRefTb4b4b4.Te6edf3backend Tff7b72= Te6edf3verifyBackendIntegrityTb4b4b4(Te6edf3exeDirTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(
Te6edf3integrityStatusRefTb4b4b4.Te6edf3backendTb4b4b4.Te6edf3ok Tff7b72&&
Te6edf3integrityStatusRefTb4b4b4.Te6edf3backendTb4b4b4.Te6edf3issuesTb4b4b4.Te6edf3length Tff7b72=== T79c0ff1 Tff7b72&&
Te6edf3integrityStatusRefTb4b4b4.Te6edf3backendTb4b4b4.Te6edf3issuesTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72=== Ta5d6ff"Manifest missing"
Tb4b4b4) Tb4b4b4{
Te6edf3logTb4b4b4(Ta5d6ff"Backend integrity manifest missing, skipping check."Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3integrityStatusRefTb4b4b4.Te6edf3backendTb4b4b4.Te6edf3okTb4b4b4) Tb4b4b4{
Te6edf3logTb4b4b4(
Ta5d6ff`Ta5d6ffINTEGRITY WARNING: Backend tampering detected! Issues: Tffd700${Te6edf3integrityStatusRefTb4b4b4.Te6edf3backendTb4b4b4.Te6edf3issuesTb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff", "Tb4b4b4)Tffd700}Ta5d6ff`
Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72const Te6edf3proc Tff7b72= Te6edf3spawnFnTb4b4b4(Te6edf3exePathTb4b4b4, Te6edf3buildBackendArgsTb4b4b4(Tb4b4b4)Tb4b4b4, Tb4b4b4{
Te6edf3envTff7b72: Te6edf3buildSpawnEnvTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3windowsHideTff7b72: Tff7b72trueTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3proc Tff7b72|| Tff7b72!Te6edf3procTb4b4b4.Te6edf3pidTb4b4b4) Tb4b4b4{
Tff7b72throw Tff7b72new Tf85149ErrorTb4b4b4(Ta5d6ff"Failed to start backend process (no PID)."Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3childProcess Tff7b72= Te6edf3procTb4b4b4;
Te6edf3runtimeState Tff7b72= Tb4b4b4{
Te6edf3startedTff7b72: Tff7b72trueTb4b4b4,
Te6edf3runningTff7b72: Tff7b72trueTb4b4b4,
Te6edf3pidTff7b72: Te6edf3procTb4b4b4.Te6edf3pidTb4b4b4,
Te6edf3lastExitCodeTff7b72: Tff7b72nullTb4b4b4,
Te6edf3lastErrorTff7b72: Ta5d6ff""Tb4b4b4,
Te6edf3lastEventAtTff7b72: Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Te6edf3attachChildHandlersTb4b4b4(Te6edf3procTb4b4b4)Tb4b4b4;
Tff7b72return Tb4b4b4{ Te6edf3okTff7b72: Tff7b72trueTb4b4b4, Te6edf3pidTff7b72: Te6edf3procTb4b4b4.Te6edf3pid Tb4b4b4}Tb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3getChildProcessTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3childProcessTb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3killChildTb4b4b4(Te6edf3signalTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3childProcessTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3childProcessTb4b4b4.Te6edf3exitCode Tff7b72!== Tff7b72null Tff7b72|| Te6edf3childProcessTb4b4b4.Te6edf3signalCode Tff7b72!== Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3processTb4b4b4.Te6edf3platform Tff7b72=== Ta5d6ff"win32"Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72const Tb4b4b4{ Te6edf3execFileSync Tb4b4b4} Tff7b72= Te6edf3requireTb4b4b4(Ta5d6ff"node:child_process"Tb4b4b4)Tb4b4b4;
Te6edf3execFileSyncTb4b4b4(Ta5d6ff"taskkill"Tb4b4b4, Tb4b4b4[Ta5d6ff"/F"Tb4b4b4, Ta5d6ff"/T"Tb4b4b4, Ta5d6ff"/PID"Tb4b4b4, Tffa657StringTb4b4b4(Te6edf3childProcessTb4b4b4.Te6edf3pidTb4b4b4)Tb4b4b4]Tb4b4b4, Tb4b4b4{
Te6edf3stdioTff7b72: Ta5d6ff"ignore"Tb4b4b4,
Te6edf3windowsHideTff7b72: Tff7b72trueTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3errorTb4b4b4) Tb4b4b4{
Te6edf3logTb4b4b4(Te6edf3errorTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3childProcessTb4b4b4.Te6edf3killTb4b4b4(Te6edf3signalTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72async Tff7b72function Te6edf3restartBackendTb4b4b4(Te6edf3integrityStatusRefTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3resolvedExePathTb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{ Te6edf3okTff7b72: Tff7b72falseTb4b4b4, Te6edf3errorTff7b72: Ta5d6ff"Backend executable is not configured." Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3isRunningTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{ Te6edf3okTff7b72: Tff7b72falseTb4b4b4, Te6edf3errorTff7b72: Ta5d6ff"Backend is already running." Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3result Tff7b72= Tff7b72await Te6edf3spawnBackendTb4b4b4(Te6edf3resolvedExePathTb4b4b4, Te6edf3integrityStatusRefTb4b4b4)Tb4b4b4;
Tff7b72return Tb4b4b4{ Te6edf3okTff7b72: Tff7b72trueTb4b4b4, Te6edf3pidTff7b72: Te6edf3resultTb4b4b4.Te6edf3pid Tb4b4b4}Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3errorTb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{ Te6edf3okTff7b72: Tff7b72falseTb4b4b4, Te6edf3errorTff7b72: Te6edf3error Tff7b72&& Te6edf3errorTb4b4b4.Te6edf3message Tff7b72? Te6edf3errorTb4b4b4.Te6edf3message Tff7b72: Tffa657StringTb4b4b4(Te6edf3errorTb4b4b4) Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72function Te6edf3buildBackendArgsTb4b4b4(Te6edf3extraArgs Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3requiredArguments Tff7b72= Tb4b4b4[Ta5d6ff"--headless"Tb4b4b4, Ta5d6ff"--port"Tb4b4b4, Ta5d6ff"9337"Tb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3userProvidedArgumentsTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"--reticulum-config-dir"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3requiredArgumentsTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff"--reticulum-config-dir"Tb4b4b4, Te6edf3reticulumConfigDirTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3userProvidedArgumentsTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"--storage-dir"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3requiredArgumentsTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff"--storage-dir"Tb4b4b4, Te6edf3storageDirTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Tb4b4b4[Tb4b4b4...Te6edf3requiredArgumentsTb4b4b4, Tb4b4b4...Te6edf3userProvidedArgumentsTb4b4b4, Tb4b4b4...Te6edf3extraArgsTb4b4b4]Tb4b4b4;
Tb4b4b4}

Tff7b72async Tff7b72function Te6edf3runMaintenanceTaskTb4b4b4(Te6edf3extraArgsTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3resolvedExePathTb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{ Te6edf3okTff7b72: Tff7b72falseTb4b4b4, Te6edf3errorTff7b72: Ta5d6ff"Backend executable is not configured." Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3isRunningTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3killChildTb4b4b4(Ta5d6ff"SIGTERM"Tb4b4b4)Tb4b4b4;
Tff7b72await Tff7b72new Tffa657PromiseTb4b4b4(Tb4b4b4(Te6edf3resolveTb4b4b4) Tb4b4b4=> Te6edf3setTimeoutTb4b4b4(Te6edf3resolveTb4b4b4, T79c0ff400Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72return Tff7b72await Tff7b72new Tffa657PromiseTb4b4b4(Tb4b4b4(Te6edf3resolveTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3stdoutChunks Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3stderrChunks Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3proc Tff7b72= Te6edf3spawnFnTb4b4b4(Te6edf3resolvedExePathTb4b4b4, Te6edf3buildBackendArgsTb4b4b4(Te6edf3extraArgsTb4b4b4)Tb4b4b4, Tb4b4b4{
Te6edf3envTff7b72: Te6edf3buildSpawnEnvTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3windowsHideTff7b72: Tff7b72trueTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3proc Tff7b72|| Tff7b72!Te6edf3procTb4b4b4.Te6edf3pidTb4b4b4) Tb4b4b4{
Te6edf3resolveTb4b4b4(Tb4b4b4{ Te6edf3okTff7b72: Tff7b72falseTb4b4b4, Te6edf3errorTff7b72: Ta5d6ff"Failed to start backend maintenance task." Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}

Te6edf3procTb4b4b4.Te6edf3stdoutTff7b72?Tb4b4b4.Te6edf3onTb4b4b4(Ta5d6ff"data"Tb4b4b4, Tb4b4b4(Te6edf3chunkTb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3stdoutChunksTb4b4b4.Te6edf3pushTb4b4b4(Tffa657StringTb4b4b4(Te6edf3chunkTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3procTb4b4b4.Te6edf3stderrTff7b72?Tb4b4b4.Te6edf3onTb4b4b4(Ta5d6ff"data"Tb4b4b4, Tb4b4b4(Te6edf3chunkTb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3stderrChunksTb4b4b4.Te6edf3pushTb4b4b4(Tffa657StringTb4b4b4(Te6edf3chunkTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3procTb4b4b4.Te6edf3onTb4b4b4(Ta5d6ff"error"Tb4b4b4, Tb4b4b4(Te6edf3errorTb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3resolveTb4b4b4(Tb4b4b4{
Te6edf3okTff7b72: Tff7b72falseTb4b4b4,
Te6edf3errorTff7b72: Te6edf3error Tff7b72&& Te6edf3errorTb4b4b4.Te6edf3message Tff7b72? Te6edf3errorTb4b4b4.Te6edf3message Tff7b72: Tffa657StringTb4b4b4(Te6edf3errorTb4b4b4)Tb4b4b4,
Te6edf3stdoutTff7b72: Te6edf3stdoutChunksTb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4,
Te6edf3stderrTff7b72: Te6edf3stderrChunksTb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3procTb4b4b4.Te6edf3onTb4b4b4(Ta5d6ff"exit"Tb4b4b4, Tb4b4b4(Te6edf3codeTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3stdout Tff7b72= Te6edf3stdoutChunksTb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3stderr Tff7b72= Te6edf3stderrChunksTb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3code Tff7b72=== T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3resolveTb4b4b4(Tb4b4b4{ Te6edf3okTff7b72: Tff7b72trueTb4b4b4, Te6edf3exitCodeTff7b72: Te6edf3codeTb4b4b4, Te6edf3stdoutTb4b4b4, Te6edf3stderr Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3resolveTb4b4b4(Tb4b4b4{
Te6edf3okTff7b72: Tff7b72falseTb4b4b4,
Te6edf3exitCodeTff7b72: Te6edf3codeTb4b4b4,
Te6edf3errorTff7b72: Ta5d6ff`Ta5d6ffMaintenance task exited with code Tffd700${Te6edf3codeTffd700}Ta5d6ff`Tb4b4b4,
Te6edf3stdoutTb4b4b4,
Te6edf3stderrTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3getResolvedExecutablePathTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3resolvedExePathTb4b4b4;
Tb4b4b4}

Tff7b72async Tff7b72function Te6edf3openCrashReportTb4b4b4(Te6edf3showCrashPageFnTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3lastCrashTb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{ Te6edf3okTff7b72: Tff7b72falseTb4b4b4, Te6edf3errorTff7b72: Ta5d6ff"No backend crash report is available." Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72await Te6edf3showCrashPageFnTb4b4b4(Te6edf3lastCrashTb4b4b4)Tb4b4b4;
Tff7b72return Tb4b4b4{ Te6edf3okTff7b72: Tff7b72true Tb4b4b4}Tb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3markBackendHealthyTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3runtimeStateTb4b4b4.Te6edf3lastExitCode Tff7b72= Tff7b72nullTb4b4b4;
Te6edf3runtimeStateTb4b4b4.Te6edf3lastError Tff7b72= Ta5d6ff""Tb4b4b4;
Te6edf3clearCrashReportTb4b4b4(Te6edf3storageDirTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3lastCrash Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}

Tff7b72return Tb4b4b4{
Te6edf3createInitialRuntimeStateTb4b4b4,
Te6edf3setUserProvidedArgumentsTb4b4b4,
Te6edf3resolveExecutablePathTb4b4b4,
Te6edf3spawnBackendTb4b4b4,
Te6edf3restartBackendTb4b4b4,
Te6edf3openCrashReportTb4b4b4,
Te6edf3getRuntimeStateTb4b4b4,
Te6edf3getLastCrashTb4b4b4,
Te6edf3getStartupDiagnosticsTb4b4b4,
Te6edf3markBackendHealthyTb4b4b4,
Te6edf3getChildProcessTb4b4b4,
Te6edf3isRunningTb4b4b4,
Te6edf3killChildTb4b4b4,
Te6edf3getJoinedLogsTb4b4b4,
Te6edf3runMaintenanceTaskTb4b4b4,
Te6edf3getResolvedExecutablePathTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}

Te6edf3moduleTb4b4b4.Te6edf3exports Tff7b72= Tb4b4b4{
Te6edf3createBackendProcessManagerTb4b4b4,
Tb4b4b4}Tb4b4b4;


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────